﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using static 摸鱼.全局类;
using static 摸鱼.MainWindow;
using System.Windows.Input;
using System.Windows.Threading;
using System.Text;
using System.IO;
using System.Diagnostics;

namespace 摸鱼
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private RoutedEventHandler 绑定方法;
        public App()
        {
            //首先注册开始和退出事件
            //this.Startup += new StartupEventHandler(App_Startup);
            //this.Exit += new ExitEventHandler(App_Exit);
        }
        //protected override void OnStartup(StartupEventArgs e)
        //{
        //    base.OnStartup(e);
        //    // 设置当主窗口关闭时退出应用程序  
        //    this.ShutdownMode = ShutdownMode.OnMainWindowClose;

        //    // 初始化主窗口等  
        //}
        //private void App_Startup(object sender, StartupEventArgs e)
        //{
        //    if (!File.Exists("调试版本.txt"))
        //    {
        //        //UI线程未捕获异常处理事件
        //        this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
        //        //Task线程内未捕获异常处理事件　　　　　
        //        TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);
        //        //非UI线程未捕获异常处理事件
        //        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        //    }
        //    else
        //        Debug.WriteLine("调试版本运行中........................");
        //}
        //private void App_Exit(object sender, ExitEventArgs e)
        //{
        //    //程序退出时需要处理的业务
        //}

        //// 处理 UI 线程上的异常  
        //private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        //{
        //    try
        //    {
        //        e.Handled = true; //把 Handled 属性设为true，表示此异常已处理，程序可以继续运行，不会强制退出  
        //        MoyuControl.ThrowShow($"UI 线程异常: {e.Exception.Message}");
        //    }
        //    catch (Exception ex)
        //    {
        //        //此时程序出现严重异常，将强制结束退出
        //        MoyuControl.ThrowShow("程序发生致命错误，将终止，请重启程序！");
        //    }
        //}
        //// 处理非 UI 线程异常  
        //private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        //{

        //    StringBuilder sbEx = new StringBuilder();
        //    if (e.IsTerminating)
        //        sbEx.Append("程序发生致命错误，将终止，请重启程序！\n");
        //    sbEx.Append("捕获未处理异常：");
        //    if (e.ExceptionObject is Exception)
        //    {
        //        sbEx.Append(((Exception)e.ExceptionObject).Message);
        //    }
        //    else
        //    {
        //        sbEx.Append(e.ExceptionObject);
        //    }
        //    MoyuControl.ThrowShow(sbEx.ToString());
        //    System.Windows.Forms.Clipboard.SetDataObject(sbEx.ToString(), true, 20, 30);
        //}
        //private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs? e)
        //{
        //    //task线程内未处理捕获
        //    MoyuControl.ThrowShow("捕获线程内未处理异常：" + e.Exception.Message);
        //    e.SetObserved();//设置该异常已察觉（这样处理后就不会引起程序崩溃）
        //}


        private void 输入框右键菜单_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            ContextMenu? 输入框右键菜单 = sender as ContextMenu;
            if (输入框右键菜单 == null)
                return;

            TextBox text输入框 = null;
            RichTextBox Rich输入框 = null;
            try
            {
                text输入框 = 鼠下控件<TextBox>();
            }
            catch (InvalidCastException ex)
            {
                Rich输入框 = 摸鱼.MainWindow.This.数据输入框;
            }
            if ((bool)e.NewValue == true)
            {
                var 变量s = UI刷新.获取变量列表();
                foreach (string item in 变量s)
                {
                    输入框右键菜单.Items.Add(new MenuItem() { Header = item });
                    if (text输入框 == null && Rich输入框 != null)
                        绑定方法 = Rich输入框菜单项_Click;
                    else
                        绑定方法 = text输入框菜单项_Click;
                    ((MenuItem)输入框右键菜单.Items[^1]).Click += 绑定方法;
                }
            }
            else
            {
                foreach (MenuItem 菜单项 in 输入框右键菜单.Items)
                    菜单项.Click -= 绑定方法;
                输入框右键菜单.Items.Clear();
                输入框右键菜单.Items.Add(new MenuItem() { Header = "复制", Command = ApplicationCommands.Copy });
                输入框右键菜单.Items.Add(new MenuItem() { Header = "粘贴", Command = ApplicationCommands.Paste });
                输入框右键菜单.Items.Add(new MenuItem() { Header = "剪切", Command = ApplicationCommands.Cut });
                输入框右键菜单.Items.Add(new MenuItem() { Header = "-------" });
            }
            void text输入框菜单项_Click(object o, RoutedEventArgs e)
            {
                text输入框.插入文本((string)((MenuItem)o).Header);
            }
            void Rich输入框菜单项_Click(object o, RoutedEventArgs e)
            {
                Rich输入框.插入文本((string)((MenuItem)o).Header);
            }
        }
    }
}
